import type { AxiosRequestConfig, AxiosResponse } from 'axios'

// 用到的单词
// intercepter (因特撒波特) 拦截器
// interface (因特费斯) 接口
// Request (蕊快斯特) 请求
// Response (蕊斯梆斯) 响应

// 定义拦截器接口
// 我们可以将这里看成是一个函数，<>中表示的是函数的参数，T参数如果没有传入，默认值为AxiosResponse，
// AxiosResponse: axios中内部封装的response返回类型
export interface RequestInterceptors<T = AxiosResponse> {
  // 请求拦截器的类型: 是一个函数，接受的参数是AxiosRequestConfig，返回也必须是AxiosRequestConfig
  // AxiosRequestConfig: axios中内部封装的用于描述我们的请求拦截器中的config的类型
  requestInterceptor?: (config: AxiosRequestConfig) => AxiosRequestConfig
  // 请求的错误类型
  requestCatch?: (error: any) => any
  // 响应拦截的参数类型，来自调用时的定义，参考
  responseInterceptor?: (config: T) => T
  responseCatch?: (error: any) => any
}

/**
 * 自定义config
 * 对AxiosRequestConfig进行扩展使其可以接受自定义的intercepters
 */
export interface RequestConfig<T = AxiosResponse> extends AxiosRequestConfig {
  // 在这里加上泛型是为了让RequestInterceptors的泛型不再是AxiosResponse的时候此处不受影响
  interceptors?: RequestInterceptors<T>
  showLoading?: boolean
  handlerStatus?: boolean
  errorMessage?: string
}

export interface ResponseConfig<T = {}> extends AxiosResponse {
  msg?: string
  message?: string
  errorMessage?: string
}

export interface handlerDescript {
  (msg: string): {
    status: number | string
    errorMessage: string[]
  }
}

export interface IErrorCodeDescript {
  [key: string]: handlerDescript
}
